package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

// Repository是Spring家族对持久层包名\类名\接口名的规范
@Repository
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
    // ItemRepository接口要继承SpringData框架提供的父接口ElasticsearchRepository
    // 一旦继承,当前接口就可以编写使用父接口中提供的连接ES的方法了
    // 继承父接口后,SpringData会根据我们在泛型中指定的Item实体类,找到对应的索引
    // 并生成操作这个索引的基本增删改查方法,我们自己无需编写
    // ElasticsearchRepository<[要操作的实体类名称],[实体类主键的类型]>

    // SpringData自定义查询
    // 我们要编写遵循SpringData给定的格式的方法名
    // SpringData会根据方法名自动推断出查询意图 生成能够完成该查询的语句
    Iterable<Item> queryItemsByTitleMatches(String title);

    // 多条件自定义查询
    // 多个条件之间要使用and或or来分隔 表示多个条件之间的逻辑关系
    Iterable<Item> queryItemsByTitleMatchesAndBrandMatches(String title,String brand);

    // 排序查询
    Iterable<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title,String brand);

    // 分页查询
    // 返回值类型需要修改为Page类型
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(
            String title, String brand, Pageable pageable);
}
